package com.trust.walletcore.example.utils

import com.solana.publickey.SolanaPublicKey
import com.solana.transaction.AccountMeta
import com.solana.transaction.TransactionInstruction


import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import wallet.core.jni.proto.Solana
import com.google.protobuf.ByteString

/**
 * 此 Activity 展示如何构造并发送购买 NFT 的交易
 */
class BuyNftActivity : AppCompatActivity() {

    // 填写您的 RPC 节点地址（例如 Devnet）
    private val rpcUrl = "https://api.devnet.solana.com"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(android.R.layout.simple_list_item_1)





        // 开始购买 NFT 操作
        Thread {
            try {
                // 获取最新区块哈希
                val recentBlockhash = fetchRecentBlockhash(rpcUrl)
                if (recentBlockhash == null) {
                    Log.e("BuyNft", "获取 recentBlockhash 失败")
                    return@Thread
                }
                // 示例参数（请根据实际情况填写正确的账户地址及参数）
                val feePayer = "YourPayerAddress"               // 支付者地址（Base58）
                val metadataAccount = "YourMetadataAccount"       // NFT 元数据账户
                val editionAccount = "YourEditionAccount"         // NFT 版本账户
                val mintAccount = "YourNftMintAccount"              // NFT 的 Mint 地址（可能需要签名）
                val associatedTokenAccount = "YourAssociatedTokenAccount" // 接收 NFT 的关联 Token 账户

                // 合约 buyNft 接口要求的参数，例如：
                val tokenName = "MyNFT"
                val tokenSymbol = "NFT"
                val tokenUri = "https://example.com/my-nft"

                val solanaPublicKey = SolanaPublicKey("".toByteArray())

                val accounts: List<AccountMeta> = listOf(
                    AccountMeta(solanaPublicKey, isSigner = true, isWritable = true),
                    AccountMeta(solanaPublicKey, isSigner = false, isWritable = true),
                    AccountMeta(solanaPublicKey, isSigner = false, isWritable = true),
                 )

                // 构造调用合约 buyNft 的指令
                val buyNftInstruction =   TransactionInstruction(
                    // 合约程序 ID（购买 NFT 合约地址）
                    solanaPublicKey,
                    accounts,
                    // 添加必需账户，顺序和 isSigner/isWritable 标记需与合约要求一致
//                    addAccounts(
//                        Solana.CreateTokenAccount
//                            .newBuilder()
//                            .setPubkey(feePayer) // payer（签名且可写）
//                            .setIsSigner(true)
//                            .setIsWritable(true)
//                            .build()
//                    )


                    // 设置调用参数数据。这里简单示例：将 tokenName、tokenSymbol、tokenUri 拼接为一个字符串，
                    // 实际中建议根据合约要求使用 Borsh 或其他格式序列化数据。
                 "tokenName:$tokenName,tokenSymbol:$tokenSymbol,tokenUri:$tokenUri".toByteArray()
                )

                // 构造 SigningInput：注意新版 Trust Wallet Core 中 SigningInput 用于构造交易
                val signingInput = Solana.SigningInput.newBuilder().apply {
                    this.recentBlockhash = recentBlockhash
                    this.feePayer = feePayer
                    rawMessage=
                        Solana.RawMessage.newBuilder()
                            //.setInstruction(buyNftInstruction)

                            .build()

                    // 注意：此处不设置私钥，签名将由钱包适配器发起
                }.build()

                // 将未签名交易序列化为 ByteArray
                val unsignedTxBytes = signingInput.toByteArray()

                // ③ 发起签名请求
                // 新版 mobile-wallet-adapter 不再需要 WalletAdapterTransaction 类，直接传入 ByteArray
//                mobileWalletAdapter.requestTransactionSignature(unsignedTxBytes, object : com.solana.mobilewalletadapter.WalletAdapterResponse {
//                    override fun onSuccess(signedTxBase58: String) {
//                        Log.i("BuyNft", "签名成功，交易 Base58 数据：$signedTxBase58")
//                        // ④ 签名成功后广播交易
//                        broadcastTransaction(signedTxBase58, rpcUrl)
//                    }
//                    override fun onFailure(error: String) {
//                        Log.e("BuyNft", "签名失败：$error")
//                    }
//                })

            } catch (e: Exception) {
                Log.e("BuyNft", "购买 NFT 过程中出现异常: ${e.message}")
            }
        }.start()
    }

    /**
     * 通过 RPC 广播签名后的交易数据（Base58 编码字符串）
     */
    private fun broadcastTransaction(signedTxBase58: String, rpcUrl: String) {
        val client = OkHttpClient()
        val jsonRequest = """
            {
              "jsonrpc": "2.0",
              "id": 1,
              "method": "sendTransaction",
              "params": ["$signedTxBase58", {"encoding": "base58"}]
            }
        """.trimIndent()
        val requestBody = jsonRequest.toRequestBody("application/json".toMediaType())
        val request = Request.Builder().url(rpcUrl).post(requestBody).build()
        client.newCall(request).execute().use { response ->
            if (response.isSuccessful) {
                val respStr = response.body?.string() ?: ""
                Log.i("BuyNft", "交易广播成功：$respStr")
            } else {
                Log.e("BuyNft", "交易广播失败：${response.message}")
            }
        }
    }

    /**
     * 通过 RPC 获取最新的区块哈希（recentBlockhash）
     */
    private fun fetchRecentBlockhash(rpcUrl: String): String? {
        val client = OkHttpClient()
        val jsonRequest = """
            {
              "jsonrpc": "2.0",
              "id": 1,
              "method": "getLatestBlockhash",
              "params": []
            }
        """.trimIndent()
        val requestBody = jsonRequest.toRequestBody("application/json".toMediaType())
        val request = Request.Builder().url(rpcUrl).post(requestBody).build()
        client.newCall(request).execute().use { response ->
            if (!response.isSuccessful) {
                Log.e("BuyNft", "获取区块哈希失败：${response.message}")
                return null
            }
            val bodyStr = response.body?.string() ?: return null
            val json = JSONObject(bodyStr)
            return json.getJSONObject("result")
                .getJSONObject("value")
                .getString("blockhash")
        }
    }
}

